#include "graphe.h"
#include "structure.h"

#include <stdio.h>
#include <stdlib.h>

/* labels des fleches */
static char S_TYPE[3][16] = {
	"mono",
	"pur",
	"choix"
};

/* termine */
int fin = 0;

/* pile des enfants */
typedef struct _pile{

	int lvl;
	int n;

	struct _pile *precedent;
	struct _pile *suivant;

}pile;

pile *tete;

/* affiche une formule dans le fichier sortie */
void getString( Formule f ){

	fprintf( sortie, "\"%i Clauses\"", f.taille );

}

/* Cree le fichier et l entete */
void creerFichier( char* fichier ){

	/* creation et ouverture du fichier */
	sortie = fopen( fichier, "w" );

	/* en tete */
	fprintf( sortie, "digraph DPC{\n" );
	fprintf( sortie, "\te0b0 [label=DPC];\n" );
	
	/* init de la pile */
	tete = (pile*) malloc( sizeof(pile) );

	tete->lvl = tete->n = 0;
	tete->precedent = tete->suivant = NULL;
}

/* ajoute un fils a l arbre courant (attention il va partir!) */
void ajouterFils( Formule f, int niveau, int TYPE, int var ){

	int nb=0, b=0;
	pile *t;

	/* on remonte */
	for( t=tete; t!=NULL && t->lvl != niveau; t=t->precedent );

	/* recuperation du nombre d enfants */
	nb = ++t->n;
	if(t->precedent==NULL) b=0;
	else b = t->precedent->n;

	/* ajout a la pile */
	if( t->suivant == NULL ){
		t->suivant = (pile*) malloc( sizeof(pile) );
		t->suivant->lvl = niveau+1;
		t->suivant->precedent = t;
		t->suivant->suivant = NULL;
		tete = t->suivant;
	}


	/* creation du noeud */
	fprintf( sortie, "\te%ib%i [label=", niveau+1, nb );
	getString( f );
	fprintf( sortie, "];\n" );

	/* creation du lien */
	fprintf( sortie, "\te%ib%i -> e%ib%i [label=\"%s: %i\"];\n", niveau, b,  niveau+1, nb, S_TYPE[TYPE], var );

	
	

}

void Consistant( int niveau ){

	int nb=0, b=0;
	pile *t;

	/* si on a pas deja fini */
	if(fin) return;

	/* on remonte */
	for( t=tete; t!=NULL && t->lvl != niveau; t=t->precedent );

	/* recuperation du nombre d enfants */
	nb = ++t->n;
	if(t->precedent==NULL) b=0;
	else b = t->precedent->n;

	/* ajout a la pile */
	if( t->suivant == NULL ){
		t->suivant = (pile*) malloc( sizeof(pile) );
		t->suivant->lvl = niveau+1;
		t->suivant->precedent = t;
		t->suivant->suivant = NULL;
		tete = t->suivant;
	}


	/* creation du noeud */
	fprintf( sortie, "\te%ib%i [label=Consistant]\n", niveau+1, nb );

	/* creation du lien */
	fprintf( sortie, "\te%ib%i -> e%ib%i;\n", niveau, b,  niveau+1, nb );

}

/* termine le fichier */
void terminerFichier(){

	pile *t, *s;

	/* fin du graphe */
	fprintf( sortie, "}\n" );

	/* on ferme le fichier */
	fclose( sortie );

	/* on vide la pile */
	for( t=tete; t->suivant!=NULL; t = t->suivant );
	s = NULL;
	for( t=tete; t!=NULL; t = t->precedent ){

		if(s!=NULL) free(s);
		s = t;

	}
	if(s!=NULL) free(s);

	fin = 1;

}
